/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package RRHH_controlador;

import CONTABILIDAD_MODELO.CON_AGUINALDO_CABECE_COMPRO;
import CONTABILIDAD_MODELO.CON_DATOS_EMPRESA;
import CONTABILIDAD_MODELO.CON_PLANILLA_AGUINALDO;
import Conexion.Conexion;
import RRHH_Modelo.RHH_BONO_ANTIGUEDAD;
import RRHH_Modelo.RHH_BONO_USUARIO;
import RRHH_Modelo.RHH_CANTIDAD_AGUINALDOS_PROVI;
import RRHH_Modelo.RHH_DEPARTAMENTO;
import RRHH_Modelo.RHH_EVENTOS_HITO;
import RRHH_Modelo.RHH_FECHAS_HITO;
import RRHH_Modelo.RHH_PERSONA;
import RRHH_Modelo.RHH_PLANILLA_AGUINALDO;
import RRHH_Modelo.RHH_PLANILLA_AGUINALDO_CABECE;
import RRHH_Modelo.RHH_PLANILLA_EMPLEADOS;
import RRHH_Modelo.RHH_REGIONAL;
import RRHH_Modelo.RHH_SALARIO_MINIMO;
import RRHH_Modelo.RHH_SUCURSAL;
import RRHH_Modelo.RHH_USUARIO;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 *
 * @author equipo_4
 */
@MultipartConfig
@WebServlet(name = "RRHH_PLANILLA_AGUINALDOS_CONTROLLER", urlPatterns = {"/RRHH_PLANILLA_AGUINALDOS_CONTROLLER"})
public class RRHH_PLANILLA_AGUINALDOS_CONTROLLER extends HttpServlet {

    /**
     * Processes requests for both HTTP
     * <code>GET</code> and
     * <code>POST</code> methods.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            /* TODO output your page here. You may use following sample code. */
            out.println("<!DOCTYPE html>");
            out.println("<html>");
            out.println("<head>");
            out.println("<title>Servlet RRHH_PLANILLA_FINIQUITOS_CONTROLLER</title>");
            out.println("</head>");
            out.println("<body>");
            out.println("<h1>Servlet RRHH_PLANILLA_FINIQUITOS_CONTROLLER at " + request.getContextPath() + "</h1>");
            out.println("</body>");
            out.println("</html>");
        } finally {
            out.close();
        }
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP
     * <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP
     * <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        try {
            RHH_USUARIO usuario = ((RHH_USUARIO) request.getSession().getAttribute("usr"));
            Conexion con = new Conexion(usuario.getUSUARIO(), usuario.getPASSWORD());
            String evento = request.getParameter("evento");
            String html = "";

            switch (evento) {
                case "cargarLista":
                    html = cargarLista(request, con);
                    break;
                case "mostrar":
                    html = mostrar(request, con);
                    break;                    
                case "nueva_planilla":
                    html = nueva_planilla(request, con);
                    break;                                
                case "eliminar":
                    html = eliminar(request, con);
                    break;                                
                case "cerrar":
                    html = cerrar(request, con);
                    break;
                case "calcular_fila":
                    html = calcular_fila(request, con);
                    break;
            }
            response.setCharacterEncoding("UTF-8");
            response.setContentType("text/plain");
            response.getWriter().write(html);
            con.Close();
        } catch (SQLException ex) {
            Logger.getLogger(RRHH_PLANILLA_AGUINALDOS_CONTROLLER.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ParseException ex) {
            Logger.getLogger(RRHH_PLANILLA_AGUINALDOS_CONTROLLER.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

    private String cargarLista(HttpServletRequest request, Conexion con) throws SQLException {
        int ano = Integer.parseInt(request.getParameter("ano"));
        String html="<ul>";
        List<RHH_PLANILLA_AGUINALDO_CABECE> lista_cabeceras = new RHH_PLANILLA_AGUINALDO_CABECE(con).BuscarXano(ano);
        for(RHH_PLANILLA_AGUINALDO_CABECE planilla:lista_cabeceras)
        {
            if(planilla.getESTADO()==0)
                html+="<li><a href='#' onclick='abrir("+planilla.getID()+");'>"+planilla.getDESCRIPCION_PAGO()+"</a></li>";
            else
                html+="<li><a href='#' onclick='abrir("+planilla.getID()+");'>"+planilla.getDESCRIPCION_PAGO()+"</a><a href='#' onclick='eliminar("+planilla.getID()+",this);'>(X)</a><a href='#' onclick='cerrar("+planilla.getID()+",this);'>(CERRAR)</a></li>";
        }
        return html+"</ul><button type='button' onclick='descripcion();'>NUEVA PLANILLA</button>";
    }
    
    private String mostrar(HttpServletRequest request, Conexion con) throws SQLException {
        int id_planilla = Integer.parseInt(request.getParameter("id_planilla"));        

        RHH_PLANILLA_AGUINALDO_CABECE planilla = new RHH_PLANILLA_AGUINALDO_CABECE(con).Buscar(id_planilla);
        String html = "";
        if(planilla!=null)
        {
            html += "<thead>";
            html += "<tr>";
            if(planilla.getESTADO()!=0)
            html += "<th rowspan='2'>EMPLEADOS SELECCIONADOS</th>";
                
            html += "<th rowspan='2'>CI</th>";
            html += "<th rowspan='2'>LUGAR DE EMISION</th>";
            html += "<th rowspan='2'>NOMBRES</th>";
            html += "<th rowspan='2'>APELLIDO PATERNO</th>";
            html += "<th rowspan='2'>APELLIDO MATERNO</th>";
            html += "<th rowspan='2'>FECHA CONTRATACION</th>";
            html += "<th rowspan='2'>FECHA RETIRO</th>";
            html += "<th colspan='3'>ANTIGUEDAD</th>";
            html += "<th rowspan='2'>CARGO</th>";
            html += "<th rowspan='2'>DEPARTAMENTO</th>";
            html += "<th rowspan='2'>REGIONAL</th>";
            html += "<th rowspan='2'>SUCURSAL</th>";
            html += "<th rowspan='2'>MESES TRABAJADOS AÑO ACTUAL</th>";
            html += "<th rowspan='2'>DIAS TRABAJADOS AÑO ACTUAL</th>";        
            html += "<th rowspan='2'>CANTIDAD DE PAGOS</th>";
            html += "<th rowspan='2'>MONTO</th>";
            html += "<th rowspan='2'>MONTO TOTAL</th>";
            html += "</tr>";
            html += "<tr>";
            html += "<th>DIA</th>";
            html += "<th>MES</th>";
            html += "<th>AÑO</th>";
            html += "</tr>";
            html += "</thead>";
            html += "<tbody>";
            List<RHH_PLANILLA_AGUINALDO> lista_detalle = new RHH_PLANILLA_AGUINALDO(con).BuscarXmaestro(id_planilla);
            for (RHH_PLANILLA_AGUINALDO detalle : lista_detalle) {
                RHH_PERSONA per = new RHH_PERSONA(con).BuscarxID_Usuario(detalle.getID_USUARIO());
                List<RHH_EVENTOS_HITO> evento_list = new RHH_EVENTOS_HITO(con).TodosRetiro();
                html += "<tr>";
                if(planilla.getESTADO()!=0)
                html += "<td><input type='checkbox' name='" + detalle.getID() + "'/></td>";
                html += "<td>" + per.getCI() + "</td>";
                html += "<td>" + per.getLUGAR_EMISION() + "</td>";
                html += "<td>" + per.getPRIMER_NOMBRE() + " " + per.getSEGUNDO_NOMBRE() + "</td>";
                html += "<td>" + per.getPRIMER_APELLIDO() + "</td>";
                html += "<td>" + per.getSEGUNDO_APELLIDO() + "</td>";
                html += "<td>" + detalle.getFECHA_INGRESO() + "</td>";
                if (detalle.getFECHA_RETIRO() != null) {
                    html += "<td>" + detalle.getFECHA_RETIRO() + "</td>";
                } else {
                    html += "<td></td>";
                }
                html += "<td>" + detalle.getANTIGUEDAD_DIA() + "</td>";
                html += "<td>" + detalle.getANTIGUEDAD_MES() + "</td>";
                html += "<td>" + detalle.getANTIGUEDAD_ANO() + "</td>";
                String cargo = detalle.getCARGO();
                cargo = cargo==null?"":cargo;
                
                html += "<td>" + cargo + "</td>";
                int id_depto = detalle.getDEPARTAMENTO();
                String depto = "***";
                if(id_depto!=0)
                    depto = new RHH_DEPARTAMENTO(con).BuscarXid(id_depto).getDESCRIPCION();
                
                depto = depto==null?"":depto;
                html += "<td>" + depto + "</td>";
                
                int id_regional = detalle.getREGIONAL();
                String regional = "***";
                if(id_regional!=0)
                    regional= new RHH_REGIONAL(con).BuscarXid(id_regional).getDESCRIPCION();
                
                regional = regional==null?"":regional;
                html += "<td>" + regional + "</td>";
                
                int id_sucursal =detalle.getSUCURSAL();
                String sucursal ="***";
                if(id_sucursal!=0)
                    sucursal = new RHH_SUCURSAL(con).BuscarXid(id_sucursal).getDESCRIPCION();
                
                sucursal = sucursal==null?"":sucursal;
                html += "<td>" +sucursal+ "</td>";
                html += "<td>" + detalle.getMESES_TRABAJADOS_ANO_ACTUAL() + "</td>";
                html += "<td>" + detalle.getDIAS_TRABAJADOS_ANO_ACTUAL() + "</td>";
                if(planilla.getESTADO()!=0)
                    html += "<td><input type='number' value='" + detalle.getCANTIDAD_PAGOS() + "' onblur='calcular_fila(this,"+planilla.getANO_PAGADO()+","+detalle.getID()+");'/></td>";                
                else
                    html += "<td>" + detalle.getCANTIDAD_PAGOS() + "</td>";
                
                html += "<td>" + detalle.getMONTO()+ "</td>";
                html += "<td>" + detalle.getMONTO_TOTAL() + "</td>";
                html += "</tr>";
            }
            html += "</tbody>";
            return html;
        }
        else
            return "";
    }
    
    private String cerrar(HttpServletRequest request, Conexion con) throws SQLException {
        int id_planilla = Integer.parseInt(request.getParameter("id_p"));
        RHH_PLANILLA_AGUINALDO_CABECE planilla = new RHH_PLANILLA_AGUINALDO_CABECE(con).Buscar(id_planilla);
        List<RHH_PLANILLA_AGUINALDO> lista = new RHH_PLANILLA_AGUINALDO(con).BuscarXmaestro(id_planilla);        
        new RHH_PLANILLA_AGUINALDO(con).EliminarXcabecera(id_planilla);        
        for(RHH_PLANILLA_AGUINALDO pla:lista)
        {
            String cheq = request.getParameter(pla.getID()+"");
            if(cheq!=null)
            {
                pla.setCon(con);
                pla.Insertar();
            }
        }        
        if(planilla!=null)
        {
            planilla.cerrar();
            return "<a href='#' onclick='abrir("+planilla.getID()+");'>"+planilla.getDESCRIPCION_PAGO()+"</a>";
        }        
        else
            return "ERROR EN LA PLANILLA";
    }
    
    
    private String nueva_planilla(HttpServletRequest request, Conexion con) throws SQLException, ParseException {
        String descripcion = request.getParameter("desc");
        String fecha = request.getParameter("fecha");
        int ano = Integer.parseInt(request.getParameter("ano"));
        
        RHH_CANTIDAD_AGUINALDOS_PROVI cant = new RHH_CANTIDAD_AGUINALDOS_PROVI(con).Buscar(ano);            
        if(cant!=null)
        {
            String consulta1 = "SELECT *\n" +
                            "  FROM BROKER.RHH_PLANILLA_AGUINALDO_CABECE\n" +
                            " WHERE (RHH_PLANILLA_AGUINALDO_CABECE.ANO_PAGADO = "+ano+") \n" +
                            "   AND  RHH_PLANILLA_AGUINALDO_CABECE.NUMERO_DE_PAGO =  \n" +
                            "    (   SELECT MAX(RHH_PLANILLA_AGUINALDO_CABECE.NUMERO_DE_PAGO)\n" +
                            "  FROM BROKER.RHH_PLANILLA_AGUINALDO_CABECE\n" +
                            " WHERE (RHH_PLANILLA_AGUINALDO_CABECE.ANO_PAGADO = "+ano+"))";
            ResultSet rs1 = con.EjecutarConsulta(consulta1);
            int numero=0;
            if(rs1.next())
            {
                numero = rs1.getInt("NUMERO_DE_PAGO")+1;
            }
            
            SimpleDateFormat formato = new SimpleDateFormat("dd/MM/yyyy");
            Date hoy = formato.parse(fecha);
            RHH_PLANILLA_AGUINALDO_CABECE planilla = new RHH_PLANILLA_AGUINALDO_CABECE(0, 1, ano, hoy, descripcion,numero);
            planilla.setCon(con);
            int id_planilla = planilla.Insertar();
            
            int cant_pagos=1;
            RHH_CANTIDAD_AGUINALDOS_PROVI cap = new RHH_CANTIDAD_AGUINALDOS_PROVI(con).Buscar(ano);
            if(cap!=null)
                cant_pagos=cap.getCANTIDAD();
                                    
                       
            
            List<RHH_USUARIO> lista = new RHH_USUARIO(con).TodosPlanillaAAnual(ano);
            for (RHH_USUARIO usr : lista) {
                String consulta = "SELECT RHH_PERSONA.CI,\n"
                        + "       RHH_PERSONA.LUGAR_EMISION,\n"
                        + "       RHH_PERSONA.PRIMER_NOMBRE,\n"
                        + "       RHH_PERSONA.SEGUNDO_NOMBRE,\n"
                        + "       RHH_PERSONA.PRIMER_APELLIDO,\n"
                        + "       RHH_PERSONA.SEGUNDO_APELLIDO,\n"
                        + "       RHH_DEPARTAMENTO.ID AS DEPTO,\n"
                        + "       RHH_REGIONAL.ID AS REGIONAL,\n"
                        + "       RHH_SUCURSAL.ID AS SUCURSAL,\n"
                        + "       RHH_CARGO.DESCRIPCION AS CARGO,\n"
                        + "       RHH_USUARIO.ID\n"
                        + "  FROM BROKER.RHH_USUARIO,\n"
                        + "       BROKER.RHH_CARGO,\n"
                        + "       BROKER.RHH_CARGO_DEP_REG_SUC,\n"
                        + "       BROKER.RHH_DEPARTAMENTO,\n"
                        + "       BROKER.RHH_REGIONAL,\n"
                        + "       BROKER.RHH_SUCURSAL,\n"
                        + "       BROKER.RHH_PERSONA\n"
                        + " WHERE     (RHH_USUARIO.ID_CARGO = RHH_CARGO.ID)\n"
                        + "       AND (RHH_CARGO_DEP_REG_SUC.ID_CARGO = RHH_CARGO.ID)\n"
                        + "       AND (RHH_USUARIO.ID_PERSONA = RHH_PERSONA.ID)\n"
                        + "       AND (RHH_CARGO_DEP_REG_SUC.ID_DEPTO = RHH_DEPARTAMENTO.ID(+))\n"
                        + "       AND (RHH_CARGO_DEP_REG_SUC.ID_REGIONAL = RHH_REGIONAL.ID(+))\n"
                        + "       AND (RHH_CARGO_DEP_REG_SUC.ID_SUCURSAL = RHH_SUCURSAL.ID(+))\n"
                        + "       AND (RHH_USUARIO.ID = " + usr.getID() + ")";
                ResultSet rs = con.EjecutarConsulta(consulta);                
                
                if (rs.next()) {
                    RHH_PLANILLA_AGUINALDO detalle = new RHH_PLANILLA_AGUINALDO(con);
                    RHH_FECHAS_HITO fecha_hito = new RHH_FECHAS_HITO(con).BuscarxUsuarioEvento(3, usr.getID());
                    Date ingreso = fecha_hito.getFECHAinDate();
                    Calendar ingreso_empresa = new GregorianCalendar();
                    ingreso_empresa.setTime(ingreso);
                    
                    Calendar calendario = new GregorianCalendar();
                    calendario.set(Calendar.HOUR_OF_DAY, 0);
                    calendario.set(Calendar.MINUTE, 0);
                    calendario.set(Calendar.SECOND, 0);

                    if(ingreso_empresa.get(Calendar.YEAR)==ano)
                    {
                        calendario=ingreso_empresa;
                        if(calendario.get(Calendar.DAY_OF_MONTH)==1 && calendario.get(Calendar.MONTH)==0)
                            calendario.add(Calendar.DAY_OF_MONTH, -1);
                    }
                    else
                    {
                        calendario.set(Calendar.YEAR, ano);
                        calendario.set(Calendar.MONTH, 0);
                        calendario.set(Calendar.DAY_OF_MONTH, 1);                        
                        calendario.add(Calendar.DAY_OF_MONTH, -1);
                    }                                        
                    
                    int anof = 0;
                    int mesf = 0;
                    int diaf = 0;

                    int dias_trabajados = 0;
                    if (ingreso != null) {
                        Date fecha1 = calendario.getTime();
                        Calendar final_de_ano = new GregorianCalendar();
                        final_de_ano.set(Calendar.YEAR, ano);
                        final_de_ano.set(Calendar.MONTH, 11);
                        final_de_ano.set(Calendar.DAY_OF_MONTH, 31);
                        final_de_ano.set(Calendar.HOUR_OF_DAY, 0);
                        final_de_ano.set(Calendar.MINUTE, 0);
                        final_de_ano.set(Calendar.SECOND, 0);
                        
                        
                        Calendar fecha_actual = new GregorianCalendar();
                        fecha_actual.set(Calendar.HOUR_OF_DAY, 0);
                        fecha_actual.set(Calendar.MINUTE, 0);
                        fecha_actual.set(Calendar.SECOND, 0);
                        
                        Date fecha2=null;
                        if(fecha_actual.before(final_de_ano))
                            fecha2=fecha_actual.getTime();
                        else
                            fecha2=final_de_ano.getTime();
                         
                        long diferencia = fecha2.getTime() - fecha1.getTime();
                        int dia = (int) (diferencia / (3600000 * 24));
                        dias_trabajados = dia;
                        calendario.add(Calendar.DAY_OF_MONTH, dia);
                        if (dia < 365) {
                            anof = 0;
                        } else {
                            anof = calendario.get(Calendar.YEAR);
                        }

                        mesf = calendario.get(Calendar.MONTH);
                        diaf = calendario.get(Calendar.DAY_OF_MONTH);
                    }
                                 
                    calendario.set(Calendar.YEAR, 0);
                    calendario.set(Calendar.MONTH, 0);
                    calendario.set(Calendar.DAY_OF_MONTH, 1);
                    
                    if (ingreso != null) {
                        Date fecha1 = ingreso;
                        Date fecha2 = new GregorianCalendar().getTime();
                        long diferencia = fecha2.getTime() - fecha1.getTime();
                        int dia = (int) (diferencia / (3600000 * 24));                        
                        calendario.add(Calendar.DAY_OF_MONTH, dia);
                        if (dia < 365) {
                            anof = 0;
                        } else {
                            anof = calendario.get(Calendar.YEAR);
                        }

                        mesf = calendario.get(Calendar.MONTH);
                        diaf = calendario.get(Calendar.DAY_OF_MONTH);
                    }

                    Calendar fecha_in = new GregorianCalendar();
                    fecha_in.setTime(ingreso);

                    Calendar calcular_ini = new GregorianCalendar();
                    if (fecha_in.get(Calendar.YEAR) < ano) {
                        calcular_ini.set(Calendar.YEAR, ano);
                        calcular_ini.set(Calendar.MONTH, 0);
                        calcular_ini.set(Calendar.DAY_OF_MONTH, 1);
                    } else {
                        calcular_ini.set(Calendar.YEAR, ano);
                        calcular_ini.set(Calendar.MONTH, fecha_in.get(Calendar.MONTH));
                        calcular_ini.set(Calendar.DAY_OF_MONTH, fecha_in.get(Calendar.DAY_OF_MONTH));
                    }                   
                    
                    if (dias_trabajados >= 90) {
                        detalle.setID_USUARIO(usr.getID());                        

                        if (fecha_hito != null) {                            
                            detalle.setFECHA_INGRESO(ingreso);
                        }

                        fecha_hito = new RHH_FECHAS_HITO(con).retiro(usr.getID());
                        if (fecha_hito != null) {                            
                            detalle.setFECHA_RETIRO(fecha_hito.getFECHAinDate());                                                        
                        }
                        
                        detalle.setANTIGUEDAD_DIA(diaf);                        
                        detalle.setANTIGUEDAD_MES(mesf);                        
                        detalle.setANTIGUEDAD_ANO(anof);

                        String cargo = rs.getString("CARGO");
                        cargo = cargo == null ? "" : cargo;                        
                        detalle.setCARGO(cargo);
                        int depto = rs.getInt("DEPTO");                        
                        detalle.setDEPARTAMENTO(depto);
                        int regional = rs.getInt("REGIONAL");                        
                        detalle.setREGIONAL(regional);
                        int sucursal = rs.getInt("SUCURSAL");                        
                        detalle.setSUCURSAL(sucursal);

                        Calendar calcular_fin = new GregorianCalendar();
                        Calendar tiempo_tabajado = new GregorianCalendar();
                        tiempo_tabajado.set(Calendar.YEAR, 0);
                        tiempo_tabajado.set(Calendar.MONTH, 0);
                        tiempo_tabajado.set(Calendar.DAY_OF_MONTH, 1);
                                                

                        tiempo_tabajado.add(Calendar.DAY_OF_MONTH, dias_trabajados);
                        int meses_trabajados = tiempo_tabajado.get(Calendar.MONTH);
                        int dias_trabajado = tiempo_tabajado.get(Calendar.DAY_OF_MONTH);
                        
                        detalle.setMESES_TRABAJADOS_ANO_ACTUAL(meses_trabajados);                        
                        detalle.setDIAS_TRABAJADOS_ANO_ACTUAL(dias_trabajado);                        
                        detalle.setID_AGUINALDO_CABECERA(id_planilla);
                        int id_detalle=detalle.Insertar();                                                
                        
                        Calendar fecha_planilla = new GregorianCalendar();
                        fecha_planilla.set(Calendar.YEAR, ano);
                        fecha_planilla.set(Calendar.MONTH, 11);

                        fecha_planilla.add(Calendar.MONTH, -3);

                        double salario1 = 0.0;
                        double salario2 = 0.0;
                        double salario3 = 0.0;

                        RHH_PLANILLA_EMPLEADOS planilla_empleados = new RHH_PLANILLA_EMPLEADOS(con).BuscarCerradaxUSUARIO(fecha_planilla.get(Calendar.YEAR), (fecha_planilla.get(Calendar.MONTH)+1), usr.getID());

                        if (planilla_empleados != null) {
                            salario1 = planilla_empleados.getTOTAL_GANADO();
                        }

                        fecha_planilla.add(Calendar.MONTH, 1);
                        planilla_empleados = new RHH_PLANILLA_EMPLEADOS(con).BuscarCerradaxUSUARIO(fecha_planilla.get(Calendar.YEAR), fecha_planilla.get(Calendar.MONTH)+1, usr.getID());

                        if (planilla_empleados != null) {
                            salario2 = planilla_empleados.getTOTAL_GANADO();
                        }
                                     
                        
                        double sueldo = new RHH_FECHAS_HITO(con).salarioUsuario(detalle.getID_USUARIO());
                        RHH_BONO_ANTIGUEDAD banti = new RHH_BONO_ANTIGUEDAD(con).sacarPorcentaje(anof);
                        double porcentaje_antiguedad = banti.getPORCENTAJE()/100;
                                                
                        List<RHH_BONO_USUARIO> otros_Ingresos = new RHH_BONO_USUARIO(con).TodosxUsuarioconImpuesto(detalle.getID_USUARIO());
                        double otro_ingreso=0.0;
                        Calendar fecha_actual = new GregorianCalendar();
                        fecha_actual.set(Calendar.YEAR,ano);
                        fecha_actual.set(Calendar.MONTH,11);
                        for(RHH_BONO_USUARIO bono:otros_Ingresos)
                        {            
                            SimpleDateFormat formatomy = new SimpleDateFormat("MM/yyyy");
                            Calendar calini = new GregorianCalendar();
                            Calendar califin = new GregorianCalendar();
                            calini.setTime(bono.getFECHA_INId());
                            califin.setTime(bono.getFECHA_FINd());            

                            boolean ok = false;
                            while(calini.before(califin)||calini.equals(califin))
                            {
                                String fechaini = formatomy.format(calini.getTime());
                                String fechaact = formatomy.format(fecha_actual.getTime());
                                if(fechaini.equals(fechaact))
                                {
                                    ok=true;
                                    break;
                                }
                                calini.add(Calendar.MONTH, 1);                   
                            }

                            if(ok)
                            {                        
                                otro_ingreso +=bono.getMONTO();                                
                            }                                                               
                        }

                        List<RHH_BONO_USUARIO> otros_Ingresos_sin_imp = new RHH_BONO_USUARIO(con).TodosxUsuarioSinImpuesto(detalle.getID_USUARIO());
                        double otro_ingreso_sin_imp=0.0;
                        for(RHH_BONO_USUARIO bono:otros_Ingresos_sin_imp)
                        {
                            SimpleDateFormat formatomy = new SimpleDateFormat("MM/yyyy");
                            Calendar calini = new GregorianCalendar();
                            Calendar califin = new GregorianCalendar();
                            calini.setTime(bono.getFECHA_INId());
                            califin.setTime(bono.getFECHA_FINd());            

                            Calendar actual = new GregorianCalendar();
                            boolean ok = false;
                            while(calini.before(califin)||calini.equals(califin))
                            {
                                String fechaini = formatomy.format(calini.getTime());
                                String fechaact = formatomy.format(actual.getTime());
                                if(fechaini.equals(fechaact))
                                {
                                    ok=true;
                                    break;
                                }
                                calini.add(Calendar.MONTH, 1);                   
                            }

                            if(ok)
                            {
                                otro_ingreso_sin_imp +=bono.getMONTO();                                
                            }                                                               
                        }       
                        
                        CON_DATOS_EMPRESA datos_empresa = new CON_DATOS_EMPRESA(con).Buscar();
                        int multiplic = datos_empresa.getBONO_ANTIGUEDAD();
                        double salariominimo_nal = new RHH_SALARIO_MINIMO(con).salarioActual();

                        double Bono_Antiguedad = porcentaje_antiguedad*(multiplic*salariominimo_nal); 
                
                        double total_ganado = sueldo+Bono_Antiguedad+otro_ingreso;
                        double total_ganado_no_imponible = total_ganado+otro_ingreso_sin_imp;    
                        
                        salario3=total_ganado_no_imponible;
                        
                        int ano_comercial = new CON_DATOS_EMPRESA(con).Buscar().getANO_COMERCIAL();
                        
                        if(dias_trabajados>ano_comercial)
                            dias_trabajados=ano_comercial;
                        
                        double monto_pagar=(((salario1+salario2+salario3)/3)*dias_trabajados)/ano_comercial;                        
                        detalle.setMONTO(monto_pagar);
                        double total_monto_a_pagar = cant_pagos*monto_pagar;
                        detalle.setCANTIDAD_PAGOS(cant_pagos);                        
                        detalle.setMONTO_TOTAL(total_monto_a_pagar);                        
                        detalle.setID(id_detalle);
                        detalle.Modificar();
                    }
                }
            }            
            return "";
        }
        else
        {
            return "-1";
        }

    }

    private String calcular_fila(HttpServletRequest request, Conexion con) throws SQLException {
        int id_planilla = Integer.parseInt(request.getParameter("id_planilla"));
        int ano = Integer.parseInt(request.getParameter("ano"));                
        int monto_retro = Integer.parseInt(request.getParameter("monto_retro"));
        String html = "";
        RHH_PLANILLA_AGUINALDO planilla = new RHH_PLANILLA_AGUINALDO(con).Buscar(id_planilla);
        RHH_PERSONA per = new RHH_PERSONA(con).BuscarxID_Usuario(planilla.getID_USUARIO());
        List<RHH_EVENTOS_HITO> evento_list = new RHH_EVENTOS_HITO(con).TodosRetiro();        
        if (planilla != null) {
            html += "<td><input type='checkbox' name='" + planilla.getID() + "'/></td>";
            html += "<td>" + per.getCI() + "</td>";
            html += "<td>" + per.getLUGAR_EMISION() + "</td>";
            html += "<td>" + per.getPRIMER_NOMBRE() + " " + per.getSEGUNDO_NOMBRE() + "</td>";
            html += "<td>" + per.getPRIMER_APELLIDO() + "</td>";
            html += "<td>" + per.getSEGUNDO_APELLIDO() + "</td>";
            html += "<td>" + planilla.getFECHA_INGRESO() + "</td>";
            if (planilla.getFECHA_RETIRO() != null) {
                html += "<td>" + planilla.getFECHA_RETIRO() + "</td>";
            } else {
                html += "<td></td>";
            }
            html += "<td>" + planilla.getANTIGUEDAD_DIA() + "</td>";
            html += "<td>" + planilla.getANTIGUEDAD_MES() + "</td>";
            html += "<td>" + planilla.getANTIGUEDAD_ANO() + "</td>";
            html += "<td>" + planilla.getCARGO() + "</td>";
            html += "<td>" + planilla.getDEPARTAMENTO() + "</td>";
            html += "<td>" + planilla.getREGIONAL() + "</td>";
            html += "<td>" + planilla.getSUCURSAL() + "</td>";
            html += "<td>" + planilla.getMESES_TRABAJADOS_ANO_ACTUAL() + "</td>";
            html += "<td>" + planilla.getDIAS_TRABAJADOS_ANO_ACTUAL() + "</td>";                 
            html += "<td><input type='number' value='" + monto_retro + "' onblur='calcular_fila(this,"+ano+"," + planilla.getID() + ");' /></td>";
            
           Calendar fecha_planilla = new GregorianCalendar();
            fecha_planilla.set(Calendar.YEAR, ano);
            fecha_planilla.set(Calendar.MONTH, 11);

            fecha_planilla.add(Calendar.MONTH, -3);

            double salario1 = 0.0;
            double salario2 = 0.0;
            double salario3 = 0.0;

            RHH_PLANILLA_EMPLEADOS planilla_empleados = new RHH_PLANILLA_EMPLEADOS(con).BuscarCerradaxUSUARIO(fecha_planilla.get(Calendar.YEAR), (fecha_planilla.get(Calendar.MONTH)+1), planilla.getID_USUARIO());

            if (planilla_empleados != null) {
                salario1 = planilla_empleados.getTOTAL_GANADO();
            }

            fecha_planilla.add(Calendar.MONTH, 1);
            planilla_empleados = new RHH_PLANILLA_EMPLEADOS(con).BuscarCerradaxUSUARIO(fecha_planilla.get(Calendar.YEAR), fecha_planilla.get(Calendar.MONTH)+1, planilla.getID_USUARIO());

            if (planilla_empleados != null) {
                salario2 = planilla_empleados.getTOTAL_GANADO();
            }


            double sueldo = new RHH_FECHAS_HITO(con).salarioUsuario(planilla.getID_USUARIO());
            RHH_BONO_ANTIGUEDAD banti = new RHH_BONO_ANTIGUEDAD(con).sacarPorcentaje(planilla.getANTIGUEDAD_ANO());
            double porcentaje_antiguedad = banti.getPORCENTAJE()/100;

            List<RHH_BONO_USUARIO> otros_Ingresos = new RHH_BONO_USUARIO(con).TodosxUsuarioconImpuesto(planilla.getID_USUARIO());
            double otro_ingreso=0.0;
            Calendar fecha_actual = new GregorianCalendar();
            fecha_actual.set(Calendar.YEAR,ano);
            fecha_actual.set(Calendar.MONTH,11);
            for(RHH_BONO_USUARIO bono:otros_Ingresos)
            {            
                SimpleDateFormat formatomy = new SimpleDateFormat("MM/yyyy");
                Calendar calini = new GregorianCalendar();
                Calendar califin = new GregorianCalendar();
                calini.setTime(bono.getFECHA_INId());
                califin.setTime(bono.getFECHA_FINd());            

                boolean ok = false;
                while(calini.before(califin)||calini.equals(califin))
                {
                    String fechaini = formatomy.format(calini.getTime());
                    String fechaact = formatomy.format(fecha_actual.getTime());
                    if(fechaini.equals(fechaact))
                    {
                        ok=true;
                        break;
                    }
                    calini.add(Calendar.MONTH, 1);                   
                }

                if(ok)
                {                        
                    otro_ingreso +=bono.getMONTO();                                
                }                                                               
            }

            List<RHH_BONO_USUARIO> otros_Ingresos_sin_imp = new RHH_BONO_USUARIO(con).TodosxUsuarioSinImpuesto(planilla.getID_USUARIO());
            double otro_ingreso_sin_imp=0.0;
            for(RHH_BONO_USUARIO bono:otros_Ingresos_sin_imp)
            {
                SimpleDateFormat formatomy = new SimpleDateFormat("MM/yyyy");
                Calendar calini = new GregorianCalendar();
                Calendar califin = new GregorianCalendar();
                calini.setTime(bono.getFECHA_INId());
                califin.setTime(bono.getFECHA_FINd());            

                Calendar actual = new GregorianCalendar();
                boolean ok = false;
                while(calini.before(califin)||calini.equals(califin))
                {
                    String fechaini = formatomy.format(calini.getTime());
                    String fechaact = formatomy.format(actual.getTime());
                    if(fechaini.equals(fechaact))
                    {
                        ok=true;
                        break;
                    }
                    calini.add(Calendar.MONTH, 1);                   
                }

                if(ok)
                {
                    otro_ingreso_sin_imp +=bono.getMONTO();                                
                }                                                               
            }       

            CON_DATOS_EMPRESA datos_empresa = new CON_DATOS_EMPRESA(con).Buscar();
            int multiplic = datos_empresa.getBONO_ANTIGUEDAD();
            double salariominimo_nal = new RHH_SALARIO_MINIMO(con).salarioActual();

            double Bono_Antiguedad = porcentaje_antiguedad*(multiplic*salariominimo_nal); 

            double total_ganado = sueldo+Bono_Antiguedad+otro_ingreso;
            double total_ganado_no_imponible = total_ganado+otro_ingreso_sin_imp;    

            salario3=total_ganado_no_imponible;           
            
            int dias_trabajados = planilla.getDIAS_TRABAJADOS_ANO_ACTUAL();
            double monto_pagar=(((salario1+salario2+salario3)/3)*dias_trabajados)/360;
            html += "<td>" + monto_pagar + "</td>";
            planilla.setMONTO(monto_pagar);
            double total_monto_a_pagar = monto_retro*monto_pagar;
            planilla.setCANTIDAD_PAGOS(monto_retro);
            html += "<td>" + total_monto_a_pagar + "</td>";
            planilla.setMONTO_TOTAL(total_monto_a_pagar);
            planilla.setID(id_planilla);
            planilla.Modificar();
            html += "</tr>";
        }
        return html;
    }

    private String eliminar(HttpServletRequest request, Conexion con) throws SQLException {
        int id_planilla=Integer.parseInt(request.getParameter("id_planilla"));
        new RHH_PLANILLA_AGUINALDO(con).EliminarXcabecera(id_planilla);
        new CON_AGUINALDO_CABECE_COMPRO(con).EliminarXid(id_planilla);
        new CON_PLANILLA_AGUINALDO(con).EliminarXcabecera(id_planilla);
        RHH_PLANILLA_AGUINALDO_CABECE cab = new RHH_PLANILLA_AGUINALDO_CABECE(con);
        cab.setID(id_planilla);
        cab.EliminarXid();
        return true+"";
    }
        
}
